package vektorrechnung;

public class VektorCalculation {

	// Basis-Rechenoperationen
	public static Vektor addiere(Vektor v1, Vektor v2)
	{
		Vektor v = new Vektor(v1.getX()+v2.getX(), v1.getY()+v2.getY(), v1.getZ()+v2.getZ());
		return v;
	}
	public static Vektor multipliziere(double a, Vektor v)
	{
		return new Vektor(v.getX()*a, v.getY()*a, v.getZ()*a);
	}
	
	// Produkte
	public static double skalar(Vektor v1, Vektor v2)
	{
		return v1.getX()*v2.getX()+v1.getY()*v2.getY()+v1.getZ()*v2.getZ();
	}
	public static Vektor kreuzprodukt(Vektor v1, Vektor v2)
	{
		Vektor v = new Vektor(v1.getY()*v2.getZ()-v2.getY()*v1.getZ(), v1.getZ()*v2.getX()-v2.getZ()*v1.getX(), v1.getX()*v2.getY()-v2.getX()*v1.getY());
		return v;
	}
	public static double spatProdukt(Vektor v1, Vektor v2, Vektor v3)
	{
		Vektor vKreuz = kreuzprodukt(v2, v3);
		return skalar(v1, vKreuz);
	}
	
	// Abstandsberechnung
	public static double getAbstand(Vektor punkt, Ebene e)
	{
		Vektor r = e.getNormalenvektor();
		Vektor a = getAbstandsvektor(punkt, e.getStuetzvektor());
		return Math.abs(skalar(a, r))/r.getLength();
	}
  public static Vektor getPedalPoint(Vektor punkt, Gerade g)
  {
    Vektor a = getAbstandsvektor(punkt, g.getStuetzvektor());
    Vektor t = g.getRichtungsvektor();
    double lamda = -skalar(t, a)/skalar(t, t);
    return addiere(a, multipliziere(lamda, t));    
  }
	public static double getAbstand(Vektor punkt, Gerade g)
	{
		return getPedalPoint(punkt, g).getLength();
	}
	public static double getAbstand(Gerade g1, Gerade g2)
	{
		Vektor n = kreuzprodukt(g1.getRichtungsvektor(), g2.getRichtungsvektor());
		Vektor a = getAbstandsvektor(g1.getStuetzvektor(), g2.getStuetzvektor());
		
		return Math.abs(skalar(a, n))/n.getLength();
	}
	public static Vektor getAbstandsvektor(Vektor v1, Vektor v2)
	{
		Vektor abstandsvektor = new Vektor(-v1.getX()+v2.getX(), -v1.getY()+v2.getY(), -v1.getZ()+v2.getZ());
		return abstandsvektor;		
	}
	
	// Komplexe Funktionen
	public static boolean eindeutigerSchnittpunktZwischenDreiEbenen(Vektor a1, Vektor a2, Vektor b1, Vektor b2, Vektor c1, Vektor c2)
	{
		Vektor n1 = kreuzprodukt(a1, a2);
		Vektor n2 = kreuzprodukt(b1, b2);
		Vektor n3 = kreuzprodukt(c1, c2);
		if(spatProdukt(n1, n2, n3)!=0)
			return true;
		else
			return false;
	}
}